window: Carry an extra input region
authorTimm Bäder <mail@baedert.org>
Sat, 22 Feb 2020 15:05:35 +0000 (16:05 +0100)
committerTimm Bäder <mail@baedert.org>
Tue, 25 Feb 2020 13:18:24 +0000 (14:18 +0100)
This will be used in the inspector to make it possible to click through
the inspector window.

gtk/gtkwindow.c
gtk/gtkwindowprivate.h

index 2f93d4ee9e2b3a92566c54ea5bf5129ec8ba936e..b1943221b00268ab8877999515bec28093e50257 100644 (file)
@@ -273,6 +273,8 @@ typedef struct
   GdkSurface  *surface;
   GskRenderer *renderer;
 
+  cairo_region_t *extra_input_region;
+
   GList *foci;
 
   GtkConstraintSolver *constraint_solver;
@@ -4670,6 +4672,7 @@ gtk_window_finalize (GObject *object)
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
   GtkMnemonicHash *mnemonic_hash;
 
+  g_clear_pointer (&priv->extra_input_region, cairo_region_destroy);
   g_free (priv->title);
   gtk_window_release_application (window);
 
@@ -5336,11 +5339,25 @@ update_csd_shape (GtkWindow *window)
     {
       cairo_region_t *region = cairo_region_create_rectangle (&rect);
 
+      if (priv->extra_input_region)
+        cairo_region_intersect (region, priv->extra_input_region);
+
       gdk_surface_input_shape_combine_region (priv->surface, region, 0, 0);
       cairo_region_destroy (region);
     }
 }
 
+void
+gtk_window_set_extra_input_region (GtkWindow      *window,
+                                   cairo_region_t *region)
+{
+  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
+  g_clear_pointer (&priv->extra_input_region, cairo_region_destroy);
+  priv->extra_input_region = cairo_region_copy (region);
+  update_csd_shape (window);
+}
+
 static void
 corner_rect (cairo_rectangle_int_t *rect,
              const GtkCssValue     *value)
index 6e6f8a6881762feb78996f00ece9a7afe7458ba9..5fc156f8f9ed1a0890371587af4ed3e5421e2504 100644 (file)
@@ -161,6 +161,9 @@ GtkWidget *      gtk_window_pick_popover (GtkWindow   *window,
                                           double       y,
                                           GtkPickFlags flags);
 
+void             gtk_window_set_extra_input_region (GtkWindow      *window,
+                                                    cairo_region_t *region);
+
 G_END_DECLS
 
 #endif /* __GTK_WINDOW_PRIVATE_H__ */